import axios from 'axios'
import qs from 'qs'
import COMMON from '@/common/common'
import CONFIG from '@/common/config'
axios.defaults.withCredentials = true
const service = axios.create({
  baseURL: CONFIG.APIURL, // api 的 base_url
  timeout: CONFIG.TIME_OUT // request timeout
})

// 封装请求拦截
service.interceptors.request.use(
  config => {
    // 获取token
    let token = COMMON.getStorage('token')
    if (config.params.loading) {
      COMMON.loading('请稍等...')
    }
    if (token !== null) {
      config.headers.token = token
      // if (config.method === 'get') {
      //   config.params['token'] = token
      // } else {
      //   if (typeof config.data === 'object') {
      //     config.data.append('token', token)
      //   } else {
      //     config.data += `&token=${token}`
      //   }
      // }
    }

    // console.log('发送请求数据：', config)
    return config
  },
  err => Promise.reject(err)
)

// 封装响应拦截
service.interceptors.response.use(
  response => {
    // console.log('接收请求数据：', response)
    const data = response.data
    COMMON.loadingClear()
    switch (data.errno) {
      case CONFIG.ERR_SUCCESS:
        // console.info('服务器返回正确的数据：')
        // console.info(data)
        return data
      case CONFIG.ERR_LOGIN:
      case CONFIG.ERR_LOGINNULL:
        COMMON.removeStorage('token')
        COMMON.toast({ msg: '登录失效，请重新登录~' }).then(() => {
          window.location.reload()
        })

        return false

      case CONFIG.ERR_ERROR:
        COMMON.toast({ msg: data.data.msg })
        return false
      default:
        COMMON.toast({ msg: '服务器错误' })
        return false
    }
  },
  err => {
    console.log('错误数据：', err)
    COMMON.loadingClear()
    COMMON.toast({ msg: '网络错误，请重试' })
    return false
  }
)

// 封装普通请求
export default function fetch(data, type) {
  // data.data['data'] = COMMON.retrunData({
  //   ...data.data
  // })
  let _data = null
  if (type === 'upLoad') {
    _data = data.data
  } else {
    _data = qs.stringify(data.data)
  }
  return service({
    url: data.url,
    method: data.method,
    params: data.params,
    data: _data
  })
}
